﻿#include "mydatabase.h"
#include "mainwindow.h"
#include "QDebug"
#include "QFile"
#include <QMessageBox>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QMap>
#include <iostream>
#include <QDir>

MyDatabase::MyDatabase(QObject *parent) : QObject(parent)
{

}
/*
    初始化数据库，没有该数据库的话，会自动创建该数据库

    sql：创建数据库时使用的语句

    例子：create TABLE Demo01(id int PRIMARY key, name char(50)
    创建一个名为"Demo01"表格，内容包括"int"类型的id数据，并设为主键，还有一个"char(50)"类型的name数据。

    返回为true时说明初始化成功
*/
bool MyDatabase::InitDatabase(QString sql){
    bool result = false;
    auto a = QDir::currentPath() + "/" + databaseName;
    QFile file(QDir::currentPath() + "/" + databaseName);
    if(file.exists())   //如果数据库存在
    {
        db = QSqlDatabase::addDatabase("QSQLITE",tableName);
        db.setDatabaseName(databaseName);    //设置数据库名称

        bool db_ok = db.open();
        if(db_ok)   //成功打开数据库
        {
            //与该数据库关联
            query = new QSqlQuery(db);
            //检测该数据库是否有表tableName
            query->exec(sql);    //执行sql语句
        }
    }
    else{   //如果数据库不存在
        db = QSqlDatabase::addDatabase("QSQLITE",tableName);
        db.setDatabaseName(databaseName);    //设置数据库名称

        //打开数据库
        bool qb_ok = db.open(); //open()返回打开结果D
        if(!qb_ok)
        {
            qDebug() << "Error: Failed to connect database." << db.lastError(); //打印错误信息
        }
        //指向该表
        query = new QSqlQuery(db);
        if(!query->exec(sql))    //执行sql语句
        {
            qDebug()<<"数据库初始化失败!";
            return false;
        }
    }

    sql = QString("pragma table_info('%1')").arg(tableName);
    if(query->exec(sql)){
        while(query->next())
        {
            dataTypeDictionary.insert(query->value(1).toString(),query->value(2).toString());
            columnCount++;
        }
    }
    else
    {
        return false;
    }

    qDebug()<<"连接数据库完成！";

    return result;
};

/*
    增添数据，一次增添一行

    value：要添加的信息（ID,name），列表对应的信息可以在
    例子：如果目前有一个Demo01表，数据类型是int，名为id，还有一个数据类型是char(50)，名为name。那么传入就为
    1 , 'hello'

    返回为true时说明添加成功
*/
bool MyDatabase::Add(QString value){
    bool reasult = false;
    QString sql ;
    sql = QString("insert into %1 values( %2 )").arg(tableName).arg(value);

    if(query->exec(sql)) //尝试运行sql
    {
        //QMessageBox::information(nullptr,"Info","insert success!");
        return true;
    }
    else
    {
        //QMessageBox::information(nullptr,"Info","insert failed!");
        return false;
    }
    return reasult;
}

/*
    删出数据，一次删一行

    where：要删除的条件

    例子：
    传入：id = 2
    删除了id为2的数据

    返回为true时说明删除成功
*/
bool MyDatabase::Delete(QString where){
    bool reasult = false;
    QString sql = "delete from "+ tableName +" where " + where;

    //query->exec("begin");
    if(query->exec(sql)) //尝试运行sql
    {
        //QMessageBox::information(nullptr,"Info","删除成功!");
        //query->exec("COMMIT");
        return true;
    }
    else
    {
        //QMessageBox::information(nullptr,"Info","删除失败!");
        //query->exec("ROLLBACK");
        return false;
    }

    return reasult;
}

/*
    更新数据

    value：被修改的值
    where：要修改的条件

    例子：
    传入：value：name = 'n'
    pwd='212133'
         where：id = 1
         name= 'su'
    修改id为1行中的name值为'n'

    返回为true时说明删除成功
*/
bool MyDatabase::Update(QString where,QString value){
    bool reasult = false;
    QString sql = "UPDATE " + tableName + " set " + value + " WHERE " + where;

    //query->exec("begin");
    if(query->exec(sql)) //尝试运行sql
    {
        //QMessageBox::information(nullptr,"Info","删除成功!");
        //query->exec("COMMIT");
        return true;
    }
    else
    {
        //QMessageBox::information(nullptr,"Info","删除失败!");
        //query->exec("ROLLBACK");
        return false;
    }

    return reasult;
}

/*
    查找数据

    where ：被查的值
    例子：where：id = 1
    查找id为1的数据，并将所有符合条件的返回出去。

    返回为QVariantList列表
*/
QVariantList MyDatabase::Find(QString where){
    QString sql;
    QVariantList bs;
//    int rowCount = 0;
    sql = "select count(*) from " + tableName + " where " + where;  //获取行数
//    if(query->exec(sql))
//    {
//        if(query->next())
//            rowCount = query->value(0).toInt();
//    }
//    else
//    {
//        qDebug()<<query->lastError();
//    }

    sql = "select * from " + tableName + " where " + where;
    if(query->exec(sql)) //尝试运行sql
    {
        int i = 0;
        while(query->next())
        {
            QVariantList b1;
            QString qs;
            qs = QString("行号：%1").arg(i++) ;
            b1.append(qs);
            for (int j = 0; j < columnCount; ++j) {
                b1.append(query->value(j));
            }
            bs.append(b1);
        }
    }
    else
    {
        qDebug()<<query->lastError();
    }
    return bs;
}


bool MyDatabase::execute(const QString &sql) {
    return query->exec(sql);
}

QSqlQuery MyDatabase::query_dhy(const QString &sql)
{
    query->exec(sql);
    return *query;
}


